require 'singleton'
require 'model/relatorio_dao'
require "model/candidato_dao"
require "model/candidato"
require "view/eleicao_view"

class RelatorioView

  include Singleton

  def initialize
    self
  end

  def cont_votos
    RelatorioDao.instance.cont_votos
  end

  def result # Mostra o numero de votos de cada candidato
    resultado = ""
    v_votos = RelatorioDao.instance.resultado
    if v_votos.is_a? PollerException
      puts "Erro: #{v_votos.msg}"
      puts "+ #{v_votos.err}"
      return nil
    end
    v_votos.each do |row|
      resultado = resultado + row[0] + " - " + row[1].to_s + "\n" unless row[0] == "BRANCO" # Exclui o branco da lista
    end
    return resultado
  end

  def inicio # Data de Inicio da eleição
    EleicaoDao.instance.inicio_eleicao?
  end

  def fim # Data de término da eleição
    EleicaoDao.instance.fim_eleicao?
  end

  def winner # Candidato que obteve o maior numero de votos
    max = 0
    v_votos = RelatorioDao.instance.resultado
    if v_votos.is_a? PollerException
      puts "Erro: #{v_votos.msg}"
      puts "+ #{v_votos.err}"
      return nil
    end
    v_votos.delete_if do |row|
      row[0] == "BRANCO"
    end
    nome = ""
    v_votos.each do |row|
      if row[1].to_i > max
        nome = row[0]
        max = row[1]
      end
    end

    obj = CandidatoDao.instance.find(nome)
    if obj.is_a? PollerException
      puts "Erro: #{obj.msg}"
      puts "+ #{obj.err}"
      return nil
    else
      "Candidato: #{obj.nome} | Partido: #{obj.partido.sigla}"
    end
  end

  def brancos # Número de votos brancos
    RelatorioDao.instance.cont_brancos
  end

  def nulos # Número de votos nulos
    RelatorioDao.instance.cont_nulos
  end

  def abstencao # Número de Abstenção
    RelatorioDao.instance.cont_abstencao
  end

  def relatorio # Exibe o relatorio
    # TODO: QUANDO DER EMPATE, AVISAR AO USUÁRIO E MOSTRAR QUE HAVERÁ SEGUNDO TURNO.
    dados = "ELEIÇÃO ENCERRADA\nInicio: #{inicio} - Fim: #{fim}\nRESULTADO FINAL\n"
    dados = dados + "#{winner}\n\nRESULTADO GERAL:\n#{result}
VOTOS BRANCOS: #{brancos}\nVOTOS NULOS: #{nulos}\nTOTAL DE VOTOS APURADOS: #{cont_votos}
TOTAL DE ABSTANÇÃO: #{abstencao}"
    # Salva do relatorio em um aquivo de texto.
    arq = File.new("relatorio.txt", "w")
    arq.puts dados # Salva em um aquivo de texto
    arq.close
    # Exibe o arquivo
    system "gedit relatorio.txt &" # executa o arquivo
  end
end
